推荐 Spring Boot/Cloud 视频:
Spring-Cloud-Gateway路由信息是通过路由定位器RouteLocator加载以及初始化的接下来阅读源码看下Spring-Cloud-Gateway是怎么一步一步的实现了路由的加载初始化。
首选我们还是在Spring-Cloud-Gateway初始化配置中看Spring-Cloud-Gateway初始化是创建了路由定位相关的那些类
------------- GatewayAutoConfiguration类
/**
* 创建一个根据RouteDefinition转换的路由定位器
*/
@Bean
public RouteLocator routeDefinitionRouteLocator(GatewayProperties properties,
List<GatewayFilterFactory> GatewayFilters,
List<RoutePredicateFactory> predicates,
RouteDefinitionLocator routeDefinitionLocator) {
return new RouteDefinitionRouteLocator(routeDefinitionLocator, predicates, GatewayFilters, properties);
}
/**
* 创建一个缓存路由的路由定位器
* @param routeLocators
* @return
*/
@Bean
@Primary//意思是在众多相同的bean中,优先使用用@Primary注解的bean.
//TODO: property to disable composite?
public RouteLocator cachedCompositeRouteLocator(List<RouteLocator> routeLocators) {
//1.创建组合路由定位器,根据(容器)已有的路由定位器集合
//2.创建缓存功能的路由定位器
return new CachingRouteLocator(new CompositeRouteLocator(Flux.fromIterable(routeLocators)));
}
从初始化配置类中可以路由定位器的创建流程
1.RouteDefinitionRouteLocator
2.CompositeRouteLocator
3.CachingRouteLocator
- 其中 RouteDefinitionRouteLocator 是获取路由的主要地方,CompositeRouteLocator,CachingRouteLocator对路由定位器做了附加功能的包装,最终使用的是CachingRouteLocator对外提供服务
下来阅读RouteLocator 接口源码:
/**
* 路由定位器,服务获取路由信息
* 1.可以通过 RouteDefinitionRouteLocator 获取 RouteDefinition ,并转换成 Route
* @author Spencer Gibb
*/
//TODO: rename to Routes?
public interface RouteLocator {
/**
* 获取路由
* @return
*/
Flux<Route> getRoutes();
}
接口很简单,有且只有一个获取路由的方法,专门用来获取路由。
RouteLocator 类图如下:
graph TD
RouteLocator-->|缓存功能实现|CachingRouteLocator
RouteLocator-->|组合功能实现|CompositeRouteLocator
RouteLocator-->|通过路由定义转换路由实现|RouteDefinitionRouteLocator
接下来我们依次阅读具体实现类
CachingRouteLocator
/**
* 路由定位器的包装类,实现了路由的本地缓存功能
* @author Spencer Gibb
*/
public class CachingRouteLocator implements RouteLocator {
/**
* 目标路由定位器
*/
private final RouteLocator delegate;
/**
* 路由信息
* Flux 相当于一个 RxJava Observable,
* 能够发出 0~N 个数据项,然后(可选地)completing 或 erroring。处理多个数据项作为stream
*/
private final Flux<Route> routes;
/**
* 本地缓存,用于缓存路由定位器获取的路由集合
*
*/
private final Map<String, List>